const express = require('express')
const cors = require('cors')
const { v4: uuidv4 } = require('uuid')

const app = express()
const PORT = 3001

// 中间件
app.use(cors())
app.use(express.json())

// 内存存储（实际项目中应该使用数据库）
const rooms = new Map()
const players = new Map()

// 模拟剧本数据
const scripts = [
  {
    id: 'script1',
    name: '夜半钟声',
    description: '民国时期，一座江南小镇的客栈里，深夜传来一声钟响，随后发现一具尸体。每个人都有自己的秘密，真相隐藏在层层迷雾中...',
    background: {
      story: '民国二十三年，江南水乡小镇。一座古老的客栈"悦来客栈"坐落在镇中心，平日里人来人往，生意兴隆。然而，在一个风雨交加的夜晚，客栈里发生了一起离奇命案。',
      timeline: [
        '晚上8点：客人陆续入住客栈',
        '晚上10点：富商在房间内与某人发生争执',
        '晚上11点：客栈老板巡视各房间',
        '晚上12点：钟楼传来一声钟响',
        '凌晨1点：发现富商尸体，胸口插着一把匕首'
      ],
      location: '悦来客栈',
      victim: {
        name: '富商张老板',
        age: 52,
        cause: '胸口被匕首刺穿，致命伤',
        time: '约晚上11:30-12:00之间'
      }
    },
    roles: [
      {
        id: 'role1',
        name: '客栈老板',
        gender: '男',
        age: 45,
        description: '客栈的主人，看似和善但眼中总有一丝不安',
        background: '你叫李三，经营这家客栈已经十年了。十年前，你从外地逃难来到这里，用仅有的积蓄买下了这家客栈。你一直小心翼翼，生怕自己的过去被人发现。',
        secret: '你其实是一个被通缉的逃犯，十年前因为抢劫杀人而逃亡。你改了名字，来到这里隐姓埋名。富商张老板认出了你，他威胁你要向官府告发你，除非你给他一大笔钱。',
        task: '1. 隐藏你的真实身份\n2. 证明你与富商的死无关\n3. 找出真正的凶手',
        clues: [
          '你昨晚11点巡视时听到富商房间有争吵声',
          '你发现富商房间的门是虚掩着的',
          '你有一把匕首，但已经不见了'
        ],
        relationship: {
          '富商': '他认出了你的真实身份，威胁你',
          '女学生': '你对她很照顾，像对待女儿一样',
          '医生': '你们是多年的朋友'
        }
      },
      {
        id: 'role2',
        name: '富商',
        gender: '男',
        age: 52,
        description: '外地来的商人，衣着华丽，出手阔绰',
        background: '你叫张富贵，是一个成功的商人。你这次来小镇是为了寻找一个失散多年的亲人。你住进了悦来客栈，准备在这里停留几天。',
        secret: '你发现客栈老板是你十年前追捕的逃犯。你本想向官府告发，但转念一想，不如借此敲诈一笔钱财。你威胁老板，如果不给你五千大洋，你就告发他。',
        task: '（已死亡）你是案件的受害者，你的任务是通过推理找出杀害你的人',
        clues: [
          '你昨晚10点在房间内与客栈老板发生争执',
          '你威胁要告发老板的真实身份',
          '你身上带着一封信，内容与你的身世有关'
        ],
        relationship: {
          '客栈老板': '你认出了他的身份，威胁要告发他',
          '女学生': '你怀疑她可能是你失散多年的女儿',
          '神秘女子': '你对她很好奇，感觉她似乎知道些什么'
        },
        isVictim: true
      },
      {
        id: 'role3',
        name: '女学生',
        gender: '女',
        age: 20,
        description: '来小镇探亲的学生，文静秀气',
        background: '你叫林小雅，是省城大学的学生。你这次来小镇是为了寻找你的亲生父母。你从小被养父母收养，一直想知道自己的身世。你听说富商张老板可能是你的父亲，所以住进了同一家客栈。',
        secret: '你昨晚偷偷跟踪富商，想确认他是否是你的父亲。你看到他进入客栈老板的房间，然后听到了争吵声。你担心富商有危险，所以一直在暗中观察。',
        task: '1. 确认富商是否是你的亲生父亲\n2. 找出杀害富商的凶手\n3. 保护自己的安全',
        clues: [
          '你昨晚10:30看到富商进入客栈老板的房间',
          '你听到房间里传来争吵声和威胁的话语',
          '你看到客栈老板离开时神色慌张',
          '你有一张旧照片，上面有你的亲生父母'
        ],
        relationship: {
          '富商': '你怀疑他是你的亲生父亲',
          '客栈老板': '你发现他似乎在隐瞒什么',
          '医生': '你向他咨询过关于身世的问题'
        }
      },
      {
        id: 'role4',
        name: '戏班班主',
        gender: '男',
        age: 38,
        description: '带着戏班四处演出的班主，能言善辩',
        background: '你叫王班主，带着一个小戏班四处演出。你们昨天刚到小镇，准备在这里演出几天。你住进了悦来客栈，因为这里的价格便宜。',
        secret: '你其实是一个骗子，专门用戏班作为掩护进行诈骗。你发现富商很有钱，想从他那里骗一笔钱。你昨晚试图接近富商，但被他拒绝了。',
        task: '1. 隐藏你的真实身份\n2. 证明你与富商的死无关\n3. 不要暴露你的诈骗计划',
        clues: [
          '你昨晚11点左右在客栈大厅里徘徊',
          '你看到富商从房间出来，神色慌张',
          '你注意到客栈老板在暗中观察富商',
          '你有一把仿制的匕首，是道具之一'
        ],
        relationship: {
          '富商': '你试图接近他，但被他拒绝了',
          '神秘女子': '你发现她似乎也在观察富商',
          '医生': '你们是点头之交'
        }
      },
      {
        id: 'role5',
        name: '医生',
        gender: '男',
        age: 40,
        description: '镇上的医生，医术精湛，为人正直',
        background: '你叫陈医生，是小镇上唯一的医生。你医术精湛，为人正直，深受镇民爱戴。你与客栈老板是多年的朋友，经常在客栈喝茶聊天。',
        secret: '你其实知道客栈老板的真实身份，但你选择帮他保守秘密，因为你相信他已经改过自新。昨晚，富商来找你，询问客栈老板的情况，你感觉到富商不怀好意。',
        task: '1. 保护客栈老板的秘密\n2. 找出杀害富商的凶手\n3. 维护正义',
        clues: [
          '你昨晚9:30看到富商来找你，询问客栈老板的情况',
          '你发现富商的眼神不对，似乎别有用心',
          '你注意到富商手上有一个奇怪的纹身',
          '你检查尸体时发现，伤口是专业人士造成的'
        ],
        relationship: {
          '客栈老板': '你们是多年的朋友，你知道他的秘密',
          '富商': '你怀疑他想要对客栈老板不利',
          '女学生': '你帮助她寻找身世'
        }
      },
      {
        id: 'role6',
        name: '神秘女子',
        gender: '女',
        age: 28,
        description: '身份不明的女子，独自一人住在客栈',
        background: '你叫苏婉，你的身份不能轻易透露。你这次来小镇是为了完成一个秘密任务。你住进了悦来客栈，一直保持低调，观察着客栈里的每一个人。',
        secret: '你其实是一个秘密特工，奉命调查富商张老板。你怀疑他参与了一桩重大的走私案件。你昨晚跟踪富商，发现他威胁客栈老板。你本想阻止，但当你赶到时，富商已经死了。',
        task: '1. 完成你的秘密任务\n2. 找出杀害富商的凶手\n3. 不要暴露你的真实身份',
        clues: [
          '你昨晚一直在暗中观察富商',
          '你看到富商威胁客栈老板的场景',
          '你听到富商房间传来的争吵声',
          '你发现富商尸体时，现场已经被破坏',
          '你有一把手枪，但昨晚没有使用'
        ],
        relationship: {
          '富商': '你奉命调查他',
          '客栈老板': '你发现他可能被富商威胁',
          '所有人': '你对他们都保持警惕'
        }
      }
    ],
    clues: [
      {
        id: 'clue1',
        name: '匕首',
        location: '富商房间',
        description: '一把普通的匕首，插在富商胸口。刀柄上没有任何指纹。',
        owner: null
      },
      {
        id: 'clue2',
        name: '威胁信',
        location: '富商房间',
        description: '一封威胁信，内容是要求客栈老板给钱，否则就告发他。',
        owner: '富商'
      },
      {
        id: 'clue3',
        name: '旧照片',
        location: '女学生房间',
        description: '一张泛黄的旧照片，上面有一个年轻女子和一个婴儿。',
        owner: '女学生'
      },
      {
        id: 'clue4',
        name: '仿制匕首',
        location: '戏班班主房间',
        description: '一把仿制的道具匕首，但看起来和真的一样。',
        owner: '戏班班主'
      },
      {
        id: 'clue5',
        name: '医疗记录',
        location: '医生房间',
        description: '一份医疗记录，显示富商最近来过诊所，询问了一些奇怪的问题。',
        owner: '医生'
      }
    ]
  },
  {
    id: 'script2',
    name: '消失的真相',
    description: '现代都市，一栋豪华公寓楼里，知名企业家离奇失踪。警方调查发现，每个人都有不在场证明，但每个人都有嫌疑...',
    background: {
      story: '2024年，繁华的都市中心。一栋豪华公寓楼"天际大厦"里，知名企业家张总在昨晚离奇失踪。警方接到报案后立即展开调查，发现张总在失踪前曾与多人接触，每个人都有不在场证明，但每个人都有嫌疑。',
      timeline: [
        '晚上7点：张总回到公寓',
        '晚上8点：张总与妻子在客厅谈话',
        '晚上9点：私人助理送来文件',
        '晚上10点：合伙人来访，讨论商业事务',
        '晚上11点：保安巡逻时看到张总在阳台',
        '凌晨12点：妻子发现张总失踪',
        '凌晨1点：警方接到报案'
      ],
      location: '天际大厦',
      victim: {
        name: '企业家张总',
        age: 48,
        cause: '失踪，现场无打斗痕迹',
        time: '约晚上11:30-12:00之间'
      }
    },
    roles: [
      {
        id: 'role7',
        name: '企业家',
        gender: '男',
        age: 48,
        description: '失踪的当事人，白手起家的商业大亨',
        background: '你叫张总，是一个成功的商业大亨。你白手起家，经过二十年的打拼，建立了一个庞大的商业帝国。你住在这栋豪华公寓的顶层，生活奢华但内心孤独。',
        secret: '你其实已经厌倦了现在的生活，想要逃离。你计划了一个假失踪，准备去一个没有人认识你的地方重新开始。你昨晚故意制造了失踪的假象，实际上你已经安排好了一切。',
        task: '（已失踪）你的任务是隐藏你的真实计划，让所有人都相信你真的失踪了',
        clues: [
          '你昨晚故意在阳台留下了一些线索',
          '你提前准备了一笔现金，放在一个秘密地点',
          '你有一张假身份证，准备用新身份生活',
          '你删除了手机里的一些重要信息'
        ],
        relationship: {
          '妻子': '你们的关系已经名存实亡，你对她已经没有感情',
          '私人助理': '她掌握了你很多秘密，你担心她会泄露',
          '合伙人': '你们最近在商业上有分歧，关系紧张'
        },
        isVictim: true
      },
      {
        id: 'role8',
        name: '妻子',
        gender: '女',
        age: 42,
        description: '企业家的妻子，优雅美丽，曾是知名律师',
        background: '你叫李雅，是张总的妻子。你曾经是一名优秀的律师，但结婚后选择了做全职太太。你们的关系在最近几年变得越来越冷淡，你感觉他不再关心你。',
        secret: '你其实已经知道张总想要离开你。你昨晚发现了他准备假失踪的计划。你本想阻止他，但转念一想，如果他真的失踪了，你就可以继承他的财产。你决定配合他的计划，甚至帮助他。',
        task: '1. 隐藏你知道张总计划的事实\n2. 让警方相信张总真的失踪了\n3. 保护自己的利益',
        clues: [
          '你昨晚在张总的书房发现了一份假失踪计划书',
          '你看到张总在准备假身份证和现金',
          '你发现张总删除了手机里的一些信息',
          '你知道张总有一个秘密的藏身地点'
        ],
        relationship: {
          '企业家': '你们的关系已经破裂，你对他已经没有感情',
          '私人助理': '你怀疑她与张总有特殊关系',
          '合伙人': '你们是点头之交，关系一般'
        }
      },
      {
        id: 'role9',
        name: '私人助理',
        gender: '女',
        age: 28,
        description: '年轻能干的助理，掌握着很多秘密',
        background: '你叫王雪，是张总的私人助理。你工作能力强，深得张总信任。你掌握着张总很多商业秘密和个人隐私。你昨晚按照惯例给张总送文件，但发现他有些异常。',
        secret: '你其实知道张总想要假失踪的计划。他曾经向你透露过这个想法，甚至希望你帮助他。但你拒绝了，因为你担心这会影响到你的工作。你昨晚发现他真的开始执行计划了，你决定保持沉默。',
        task: '1. 隐藏你知道张总计划的事实\n2. 保护自己的工作和利益\n3. 不要让警方怀疑你',
        clues: [
          '你昨晚给张总送文件时，发现他在收拾东西',
          '你看到张总在准备假身份证',
          '你发现张总删除了电脑里的一些重要文件',
          '你知道张总有一个秘密账户'
        ],
        relationship: {
          '企业家': '你们是工作关系，但你知道他很多秘密',
          '妻子': '你们关系一般，你感觉她对你有些敌意',
          '合伙人': '你们是点头之交'
        }
      }
    ],
    clues: [
      {
        id: 'clue6',
        name: '假身份证',
        location: '企业家房间',
        description: '一张伪造的身份证，上面的照片是张总，但名字和地址都是假的。',
        owner: '企业家'
      },
      {
        id: 'clue7',
        name: '假失踪计划书',
        location: '企业家书房',
        description: '一份详细的假失踪计划书，详细说明了如何制造失踪假象。',
        owner: '企业家'
      },
      {
        id: 'clue8',
        name: '秘密账户信息',
        location: '私人助理房间',
        description: '一份秘密账户的信息，显示张总有一个不为人知的银行账户。',
        owner: '私人助理'
      },
      {
        id: 'clue9',
        name: '删除的文件记录',
        location: '企业家电脑',
        description: '电脑上显示张总在昨晚删除了大量文件，包括一些商业机密。',
        owner: null
      },
      {
        id: 'clue10',
        name: '现金',
        location: '企业家房间',
        description: '一大笔现金，约50万元，放在一个隐蔽的地方。',
        owner: '企业家'
      }
    ]
  }
]

// 获取剧本列表
app.get('/api/scripts', (req, res) => {
  const scriptList = scripts.map(script => ({
    id: script.id,
    name: script.name,
    description: script.description,
    roleCount: script.roles.length
  }))

  res.json({
    success: true,
    scripts: scriptList
  })
})

// 获取剧本详细信息
app.get('/api/scripts/:id', (req, res) => {
  const scriptId = req.params.id
  const script = scripts.find(s => s.id === scriptId)

  if (!script) {
    return res.json({
      success: false,
      message: '剧本不存在'
    })
  }

  // 返回剧本信息，但不包含角色的秘密和任务（这些需要玩家选择角色后才能看到）
  const scriptInfo = {
    id: script.id,
    name: script.name,
    description: script.description,
    background: script.background || null,
    roles: script.roles.map(role => ({
      id: role.id,
      name: role.name,
      gender: role.gender,
      age: role.age,
      description: role.description
    })),
    clues: script.clues || []
  }

  res.json({
    success: true,
    script: scriptInfo
  })
})

// 获取角色详细信息（需要玩家已选择该角色）
app.get('/api/scripts/:scriptId/roles/:roleId', (req, res) => {
  const { scriptId, roleId } = req.params
  const script = scripts.find(s => s.id === scriptId)

  if (!script) {
    return res.json({
      success: false,
      message: '剧本不存在'
    })
  }

  const role = script.roles.find(r => r.id === roleId)

  if (!role) {
    return res.json({
      success: false,
      message: '角色不存在'
    })
  }

  // 返回完整的角色信息，包括背景、秘密、任务、线索等
  res.json({
    success: true,
    role: {
      id: role.id,
      name: role.name,
      gender: role.gender,
      age: role.age,
      description: role.description,
      background: role.background || '',
      secret: role.secret || '',
      task: role.task || '',
      clues: role.clues || [],
      relationship: role.relationship || {}
    }
  })
})

// 获取房间列表
app.get('/api/rooms', (req, res) => {
  const roomList = Array.from(rooms.values()).map(room => ({
    id: room.id,
    name: room.name,
    currentPlayers: room.players.length,
    maxPlayers: room.maxPlayers,
    status: room.status,
    script: room.script ? scripts.find(s => s.id === room.script)?.name : null
  }))

  res.json({
    success: true,
    rooms: roomList
  })
})

// 创建房间
app.post('/api/rooms/create', (req, res) => {
  const { scriptId } = req.body
  const roomId = uuidv4().substring(0, 8)
  
  // 验证剧本是否存在
  let maxPlayers = 6
  if (scriptId) {
    const script = scripts.find(s => s.id === scriptId)
    if (!script) {
      return res.json({
        success: false,
        message: '剧本不存在'
      })
    }
    // 根据剧本的角色数量设置最大玩家数
    maxPlayers = script.roles.length
  }
  
  const room = {
    id: roomId,
    name: `房间 ${roomId}`,
    players: [],
    maxPlayers: maxPlayers,
    status: 'waiting',
    script: scriptId || null,
    hostId: null
  }

  rooms.set(roomId, room)

  res.json({
    success: true,
    roomId: roomId
  })
})

// 获取房间详情
app.get('/api/rooms/:id', (req, res) => {
  const roomId = req.params.id
  const room = rooms.get(roomId)

  if (!room) {
    return res.json({
      success: false,
      message: '房间不存在'
    })
  }

  // 检查是否是房主（简化处理，实际应该用session或token）
  const isHost = room.hostId === null || room.players.length === 0

  // 获取当前玩家的角色（简化处理）
  const myRole = null // 实际应该从session获取

  res.json({
    success: true,
    room: {
      id: room.id,
      name: room.name,
      currentPlayers: room.players.length,
      maxPlayers: room.maxPlayers,
      status: room.status,
      players: room.players,
      isHost: isHost,
      myRole: myRole,
      script: room.script || null
    }
  })
})

// 获取角色列表
app.get('/api/rooms/:id/roles', (req, res) => {
  const roomId = req.params.id
  const room = rooms.get(roomId)

  if (!room) {
    return res.json({
      success: false,
      message: '房间不存在'
    })
  }

  // 如果没有选择剧本，使用默认剧本
  const scriptId = room.script || scripts[0].id
  const script = scripts.find(s => s.id === scriptId)

  if (!script) {
    return res.json({
      success: false,
      message: '剧本不存在'
    })
  }

  // 标记已选择的角色
  const selectedRoleIds = new Set(room.players.map(p => p.roleId))
  const roles = script.roles.map(role => ({
    id: role.id,
    name: role.name,
    gender: role.gender,
    age: role.age,
    description: role.description,
    taken: selectedRoleIds.has(role.id)
  }))

  res.json({
    success: true,
    script: {
      id: script.id,
      name: script.name,
      description: script.description,
      background: script.background || null
    },
    roles: roles
  })
})

// 选择角色
app.post('/api/rooms/:id/select-role', (req, res) => {
  const roomId = req.params.id
  const { roleId } = req.body
  const room = rooms.get(roomId)

  if (!room) {
    return res.json({
      success: false,
      message: '房间不存在'
    })
  }

  if (room.status !== 'waiting') {
    return res.json({
      success: false,
      message: '游戏已开始或已结束'
    })
  }

  // 检查角色是否已被选择
  const scriptId = room.script || scripts[0].id
  const script = scripts.find(s => s.id === scriptId)
  const role = script?.roles.find(r => r.id === roleId)

  if (!role) {
    return res.json({
      success: false,
      message: '角色不存在'
    })
  }

  const selectedRoleIds = new Set(room.players.map(p => p.roleId))
  if (selectedRoleIds.has(roleId)) {
    return res.json({
      success: false,
      message: '该角色已被选择'
    })
  }

  // 添加玩家（简化处理，实际应该用session）
  const playerId = uuidv4()
  const player = {
    id: playerId,
    name: `玩家${room.players.length + 1}`,
    roleId: roleId,
    role: role.name
  }

  room.players.push(player)

  // 设置第一个玩家为房主
  if (room.hostId === null) {
    room.hostId = playerId
  }

  // 返回角色的详细信息（包括背景、秘密、任务、线索等）
  const roleDetails = {
    id: role.id,
    name: role.name,
    gender: role.gender,
    age: role.age,
    description: role.description,
    background: role.background || '',
    secret: role.secret || '',
    task: role.task || '',
    clues: role.clues || [],
    relationship: role.relationship || {}
  }

  res.json({
    success: true,
    message: '角色选择成功',
    role: roleDetails
  })
})

// 开始游戏
app.post('/api/rooms/:id/start', (req, res) => {
  const roomId = req.params.id
  const room = rooms.get(roomId)

  if (!room) {
    return res.json({
      success: false,
      message: '房间不存在'
    })
  }

  if (room.status !== 'waiting') {
    return res.json({
      success: false,
      message: '游戏已开始或已结束'
    })
  }

  // 检查是否有玩家
  if (room.players.length === 0) {
    return res.json({
      success: false,
      message: '房间内没有玩家'
    })
  }

  // 检查是否所有玩家都选择了角色
  const playersWithoutRole = room.players.filter(p => !p.roleId || !p.role)
  if (playersWithoutRole.length > 0) {
    return res.json({
      success: false,
      message: `还有${playersWithoutRole.length}名玩家未选择角色，请等待所有玩家选择角色后再开始游戏`
    })
  }

  // 检查玩家数量是否达到最小要求（至少2人）
  if (room.players.length < 2) {
    return res.json({
      success: false,
      message: '至少需要2名玩家才能开始游戏'
    })
  }

  // 检查玩家数量是否超过最大限制
  if (room.players.length > room.maxPlayers) {
    return res.json({
      success: false,
      message: `玩家数量超过最大限制（${room.maxPlayers}人）`
    })
  }

  // 如果房间有剧本，检查玩家数量是否匹配剧本要求
  if (room.script) {
    const script = scripts.find(s => s.id === room.script)
    if (script && room.players.length !== script.roles.length) {
      return res.json({
        success: false,
        message: `该剧本需要${script.roles.length}名玩家，当前有${room.players.length}名玩家`
      })
    }
  }

  room.status = 'playing'

  res.json({
    success: true,
    message: '游戏开始'
  })
})

// 启动服务器
app.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:${PORT}`)
})

